package com.swak.fx.support.ui;

import com.swak.utils.Ints;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.control.Label;

public class UIBadge extends Label implements UILifecycle {

	// ================================================================================
	// Properties
	// ================================================================================
	private final String STYLE_CLASS = "ui-badge";
	private final String STYLESHEET = UI.load("css/UIBadge.css");

	public UIBadge() {
		super();
		init();
	}

	public UIBadge(int count) {
		super();
		init();
		this.countProperty.set(count);
	}

	@Override
	public void initializeParts() {
		getStyleClass().add(STYLE_CLASS);
	}

	@Override
	public void setupValueChangedListeners() {
		this.fixedWidth();
		this.countProperty().addListener((ob, o, n) -> this.showText());
		this.maxProperty().addListener((ob, o, n) -> this.showText());
	}

	private void showText() {
		int max = this.maxProperty.get();
		int count = this.countProperty.get();
		int show = Ints.min(max, count);
		if (count > max) {
			this.setText(show + "+");
		} else {
			this.setText(show + "");
		}
	}

	/**
	 * 固定大小, 不会将文本压缩为省略号; 用Text
	 * 
	 * @return
	 */
	public UIBadge fixedWidth() {
		this.ellipsisStringProperty().bind(this.textProperty());
		return this;
	}

	// ================================================================================
	// Overridden Methods
	// ================================================================================
	@Override
	public String getUserAgentStylesheet() {
		return STYLESHEET;
	}

	// ================================================================================
	// Properties
	// ================================================================================
	private final IntegerProperty countProperty = new SimpleIntegerProperty();

	public IntegerProperty countProperty() {
		return countProperty;
	}

	private final IntegerProperty maxProperty = new SimpleIntegerProperty(99);

	public IntegerProperty maxProperty() {
		return maxProperty;
	}
}